home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / python-support / python-rdflib / rdflib / Journal.py < prev    next >
Encoding:
Python Source  |  2007-04-04  |  2.3 KB  |  72 lines

  1. import logging
  2.  
  3. _logger = logging.getLogger(__name__)
  4.  
  5. from rdflib.Graph import QuotedGraph
  6. from rdflib.events import Event, Dispatcher
  7. from rdflib.store import TripleAddedEvent, TripleRemovedEvent, StoreCreatedEvent
  8.  
  9.  
  10. class JournalWriter(object):
  11.     """
  12.     Writes a journal of the store events.
  13.     """
  14.  
  15.     def __init__(self, store, stream=None, filename=None):
  16.         if stream is None:
  17.             assert filename, "Must specify either stream or filename"
  18.             stream = file(filename, "ab")
  19.         dispatcher = store.dispatcher
  20.         dispatcher.subscribe(TripleAddedEvent, self.journal_event)
  21.         dispatcher.subscribe(TripleRemovedEvent, self.journal_event)
  22.         dispatcher.subscribe(StoreCreatedEvent, self.journal_event)
  23.         self._dumps = store.node_pickler.dumps
  24.         self._write = stream.write
  25.  
  26.     def journal_event(self, event):
  27.         self._write(self._dumps(event))
  28.         self._write("\n\n")
  29.  
  30.  
  31. class JournalReader(object):
  32.     """
  33.     Reads a journal of store events into a store.
  34.     """
  35.  
  36.     def __init__(self, store, filename):
  37.         self.stream = file(filename, "rb")
  38.         self.store = store
  39.         dispatcher = Dispatcher()
  40.         dispatcher.subscribe(TripleAddedEvent, self.add)
  41.         dispatcher.subscribe(TripleRemovedEvent, self.remove)
  42.         dispatcher.subscribe(StoreCreatedEvent, self.store_created)
  43.         loads = store.node_pickler.loads
  44.         dispatch = dispatcher.dispatch
  45.         lines = []
  46.         for line in self.stream:
  47.             if line=="\n":
  48.                 try:
  49.                     event = loads("".join(lines))
  50.                     dispatch(event)
  51.                     lines = []
  52.                 except Exception, e:
  53.                     _logger.exception(e)
  54.                     _logger.debug("lines: '%s'" % lines)
  55.                     lines = []
  56.             else:
  57.                 lines.append(line)
  58.  
  59.     def add(self, event):
  60.         context = event.context
  61.         quoted = isinstance(context, QuotedGraph)
  62.         self.store.add(event.triple, context, quoted)
  63.  
  64.     def remove(self, event):
  65.         self.store.remove(event.triple, event.context)
  66.         
  67.     def store_created(self, event):
  68.         n = len(self.store)
  69.         if n>0:
  70.             _logger.warning("Store not empty for 'store created'. Contains '%s' assertions" % n)
  71.         # TODO: clear store
  72.